package com.gientech.droolsdemo001.test;

import com.gientech.droolsdemo001.entity.Customer;
import com.gientech.droolsdemo001.entity.Order;
import org.drools.core.base.RuleNameEndsWithAgendaFilter;
import org.junit.Test;
import org.kie.api.KieServices;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;

import java.util.ArrayList;
import java.util.List;



public class testDrools {

    @Test
    public void test1_score_rules(){
        //第一步
        KieServices kieServices = KieServices.Factory.get();
        //第二步
        KieContainer container =  kieServices.getKieClasspathContainer();
        //第三步
        KieSession kieSession = container.newKieSession();

        //事实对象
        Order order = new Order();
        order.setAmount(500);

        //第四步
        kieSession.insert(order);

        //第五步，执行规则引擎
        kieSession.fireAllRules();

        //第六步
        kieSession.dispose();

        System.out.println("执行规则后，积分是" + order.getScore());

    }

    @Test
    public void test2_customer_rules_contain(){
        //第一步
        KieServices kieServices = KieServices.Factory.get();
        //第二步
        KieContainer container =  kieServices.getKieClasspathContainer();
        //第三步
        KieSession kieSession = container.newKieSession();

        //事实对象
        Order order = new Order();
        order.setAmount(200);
        Customer customer = new Customer();
        List<Order> orderList = new ArrayList<>();
        orderList.add(order);
        customer.setOrderList(orderList);

        //第四步
        kieSession.insert(order);
        kieSession.insert(customer);

        //第五步，执行规则引擎
        kieSession.fireAllRules();

        //第六步
        kieSession.dispose();

    }

    @Test
    public void test3_customer_rules_not_contain(){
        //第一步
        KieServices kieServices = KieServices.Factory.get();
        //第二步
        KieContainer container =  kieServices.getKieClasspathContainer();
        //第三步
        KieSession kieSession = container.newKieSession();

        //事实对象
        Order order = new Order();
        order.setAmount(200);
        Customer customer = new Customer();
        List<Order> orderList = new ArrayList<>();
//        orderList.add(order);
        customer.setOrderList(orderList);

        //第四步
        kieSession.insert(order);
        kieSession.insert(customer);

        //第五步，执行规则引擎
        kieSession.fireAllRules();

        //第六步
        kieSession.dispose();

    }

    @Test
    public void test4_member_rules_memberOf(){
        //第一步
        KieServices kieServices = KieServices.Factory.get();
        //第二步
        KieContainer container =  kieServices.getKieClasspathContainer();
        //第三步
        KieSession kieSession = container.newKieSession();

        //事实对象
        Order order = new Order();
        order.setAmount(200);
        Customer customer = new Customer();
        List<Order> orderList = new ArrayList<>();
        orderList.add(order);
        customer.setOrderList(orderList);

        //第四步
        kieSession.insert(order);
        kieSession.insert(customer);

        //第五步，执行规则引擎
//        kieSession.fireAllRules();
        kieSession.fireAllRules(new RuleNameEndsWithAgendaFilter("customer_1"));

        //第六步
        kieSession.dispose();

    }

    @Test
    public void test5_member_rules_not_memberOf(){
        //第一步
        KieServices kieServices = KieServices.Factory.get();
        //第二步
        KieContainer container =  kieServices.getKieClasspathContainer();
        //第三步
        KieSession kieSession = container.newKieSession();

        //事实对象
        Order order = new Order();
        order.setAmount(200);
        Customer customer = new Customer();
        List<Order> orderList = new ArrayList<>();
//        orderList.add(order);
        customer.setOrderList(orderList);

        //第四步
        kieSession.insert(order);
        kieSession.insert(customer);

        //第五步，执行规则引擎
        kieSession.fireAllRules();

        //第六步
        kieSession.dispose();

    }

    @Test
    public void test6_matches_rules_matches(){
        //第一步
        KieServices kieServices = KieServices.Factory.get();
        //第二步
        KieContainer container =  kieServices.getKieClasspathContainer();
        //第三步
        KieSession kieSession = container.newKieSession();

        //事实对象
        Customer customer = new Customer();
        customer.setName("张三");

        //第四步
        kieSession.insert(customer);

        //第五步，执行规则引擎
        kieSession.fireAllRules();

        //第六步
        kieSession.dispose();

    }

    @Test
    public void test7_matches_rules_not_matches(){
        //第一步
        KieServices kieServices = KieServices.Factory.get();
        //第二步
        KieContainer container =  kieServices.getKieClasspathContainer();
        //第三步
        KieSession kieSession = container.newKieSession();

        //事实对象
        Customer customer = new Customer();
        customer.setName("赵四");

        //第四步
        kieSession.insert(customer);

        //第五步，执行规则引擎
        kieSession.fireAllRules();

        //第六步
        kieSession.dispose();

    }

    @Test
    public void test8_inside_rules(){
        //第一步
        KieServices kieServices = KieServices.Factory.get();
        //第二步
        KieContainer container =  kieServices.getKieClasspathContainer();
        //第三步
        KieSession kieSession = container.newKieSession();

        //第五步，执行规则引擎
        kieSession.fireAllRules();

        //第六步
        kieSession.dispose();

    }

    @Test
    public void test9_inside_rules(){
        System.setProperty("drools.dateformat", "yyyy-MM-dd");
        //第一步
        KieServices kieServices = KieServices.Factory.get();
        //第二步
        KieContainer container =  kieServices.getKieClasspathContainer();
        //第三步
        KieSession kieSession = container.newKieSession();

        //第四步：事实对象
        Customer customer = new Customer();
        customer.setName("王五");

        kieSession.insert(customer);

        //第五步，执行规则引擎
        kieSession.fireAllRules();

        //第六步
        kieSession.dispose();

        System.out.println("执行规则后，name为：" + customer.getName());

    }

    @Test
    // 优先级测试
    public void test10_inside_rules_salience(){

        //第一步
        KieServices kieServices = KieServices.Factory.get();
        //第二步
        KieContainer container =  kieServices.getKieClasspathContainer();
        //第三步
        KieSession kieSession = container.newKieSession();

        //第四步：事实对象
        Customer customer = new Customer();
        customer.setName("王五");

        kieSession.insert(customer);

        //第五步，执行规则引擎
        kieSession.fireAllRules();

        //第六步
        kieSession.dispose();

        System.out.println("执行规则后，name为：" + customer.getName());

    }
}
